//package yi_run_zheng;

/**
 * @CLASSDESCRIPER: 使用单链表实现入队与出队 本次作业花费14分钟
 * @AUTHOR:yirunzheng
 * @EMAIL:yrz_77@163.com
 * @DATE:2021\1\23 0023
 */
public class YI_RUN_ZHENG_23_Q2<T> {
    private int len;//队内的长度
    private Node<T> head;//头节点
    private int size;//队的大小
    //创建一个Node容器
    class Node<T>{
        //设定Node的两个属性
        T t;
        Node next;
        //
        public Node(T t,Node next){
            this.t=t;
            this.next=next;
        }
    }
//    //创建一个空队
//    public YI_RUN_ZHENG_23_Q2(){
//        //初始化 创建Node对象，也就是创建了一个空队
//        head = new Node(null,null);
//        len = 0;
//        size = 0;
//    }
    //定义队的大小
    public YI_RUN_ZHENG_23_Q2(int size){
        //初始化 创建Node对象，也就是创建了一个队
        head = new Node(null,null);
        len = 0;
        this.size=size;
    }
    /**
     * 入队方法 先判断队是否已满
    * */
    public void into(T t){
        if (this.len==size){
            throw new RuntimeException("此队已满");
        }
        Node last=new Node(t,null);      //新建队尾元素
        Node before=head;                     //令初始节点为头节点
        while(before.next!=null){             //只要下一节点不为空就从头节点1个1个移动到之前的队尾
            before=before.next;
        }
        //尾节点进行添加
        before.next=last;                      //之前的队尾的下一节点为现节点
        this.len++;                           //队内的长度+1
    }

    /**
     * 出队方法：先判断队是否已空 在判断len不为1时从队首删除1个元素
     */
    public void out(){
        if (this.len==0){
            throw new RuntimeException("此队已空");
        }
                Node before = head;                     //令初始节点为头节点
                Node first = before.next;               //找到第1个节点的下一元素
                before.next = first.next;               //令头节点的下一元素为第1个节点的下一元素
                this.len--;                             //队内的长度-1
        }
    public static void main(String[] args) {
        YI_RUN_ZHENG_23_Q2 queue = new YI_RUN_ZHENG_23_Q2(5);
        queue.into(1);
        queue.into(2);
        queue.into(3);
        queue.into(4);
        System.out.println("入队后的队长："+queue.len);
        queue.out();
        queue.out();
        queue.out();
        queue.out();
        System.out.println("出队后的队长："+queue.len);
    }
}